OpenCV HOG+SVM 分类器训练与检测

先从检测说起。

现有的OpenCV版本中有完整的基于HOG+SVM的检测代码,主要用到HOGDescriptor这个类。两个关键函数:

hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());//导入分类器,默认采用的是Dalal提出的算法模型,其实是svm训练得到的支持向量

hog.detectMultiScale(img, found, 0, Size(8,8), Size(32,32), 1.05, 2);//多尺度遍历,可以检测一定范围内的行人目标,当然现有的模型是基于64*128行人大小的,所以对中小目标检测效果不佳

在程序框架建立过程中,问题没有出现多少,毕竟熟能生巧,意外的收获是:opencv众所周知地没有注释难以看懂,但是对于一个可执行程序,都用一个函数来说明程序实现功能,在一定程度上缓和我对opencv的反感吧。其实opencv的代码风格其他方面真的很好,今后可以借鉴之。先列举其一吧:

void help()
{
printf(
“\nDemonstrate the use of the HoG descriptor using\n”
“ HOGDescriptor::hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());\n”
“Usage:\n”
“./peopledetect (<image_filename> | <image_list>.txt)\n\n” );
}

再来说训练。

不同于Cascade,opencv中没有专门对hog特征的svm的训练,必须自己按照需要,选择特征算子和分类器,这里我先选了hog和svm(与latent svm 区分)。在调试过程中出现了很多bug,变量找不到定义(包含头文件)、无法解析的外部符号Link 2019 (找到函数的实现文件),这些问题也都一一解决了。我不得不再吐槽一下,像这种无注释源文件的真心没辙,网上百度、google都有可能找不到解决方案,还得一个个include和添加cpp去实验,以后写代码一定好写好注释,方便别人阅读嘛。

总结一下:

  • 项目属性中除了包含core、imgproc、highgui等常用的lib和头文件,在此情况下(训练和检测)要包含ml(machine learning)和objdetect(object detect)的lib和头文件。
  • 工程文件中还要用到/opencv2.0/modules/objdetect/src下面的inner_functions.cpp文件,用在需要线性插值的地方。
     
Jerky Lu wechat
欢迎加入微信公众号